package com.sl.utils.office.excel.xls;

import com.sl.utils.date.DateUtils;
import com.sl.utils.office.word.WordUtils;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor.HSSFColorPredefined;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.FillPatternType;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;

/**
 * Demonstrates many features of the user API at once.  Used in the HOW-TO guide.
 * 具体参考 http://poi.apache.org/spreadsheet/examples.html#business-plan
 */
public class BigExample {

    public static void main(String[] args) throws IOException {
        URL basePath = WordUtils.class.getClassLoader().getResource("");
        String outPutPath = basePath.getPath() + "/temp/"+ DateUtils.getCurrentTime_yyyyMMddHHmmssSSS();

        int rownum;

        // create a new workbook
        try (HSSFWorkbook wb = new HSSFWorkbook()) {
            // create a new sheet
            HSSFSheet s = wb.createSheet();
            // declare a row object reference
            HSSFRow r;
            // declare a cell object reference
            HSSFCell c;
            // create 3 cell styles
            HSSFCellStyle cs = wb.createCellStyle();
            HSSFCellStyle cs2 = wb.createCellStyle();
            HSSFCellStyle cs3 = wb.createCellStyle();
            // create 2 fonts objects
            HSSFFont f = wb.createFont();
            HSSFFont f2 = wb.createFont();

            //set font 1 to 12 point type
            f.setFontHeightInPoints((short) 12);
            //make it red
            f.setColor(HSSFColorPredefined.RED.getIndex());
            // make it bold
            //arial is the default font
            f.setBold(true);

            //set font 2 to 10 point type
            f2.setFontHeightInPoints((short) 10);
            //make it the color at palette index 0xf (white)
            f2.setColor(HSSFColorPredefined.WHITE.getIndex());
            //make it bold
            f2.setBold(true);

            //set cell style
            cs.setFont(f);
            //set the cell format see HSSFDataFormat for a full list
            cs.setDataFormat(HSSFDataFormat.getBuiltinFormat("($#,##0_);[Red]($#,##0)"));

            //set a thin border
            cs2.setBorderBottom(BorderStyle.THIN);
            //fill w fg fill color
            cs2.setFillPattern(FillPatternType.SOLID_FOREGROUND);
            // set foreground fill to red
            cs2.setFillForegroundColor(HSSFColorPredefined.RED.getIndex());

            // set the font
            cs2.setFont(f2);

            // set the sheet name to HSSF Test
            wb.setSheetName(0, "HSSF Test");
            // create a sheet with 300 rows (0-299)
            for (rownum = 0; rownum < 300; rownum++) {
                // create a row
                r = s.createRow(rownum);
                // on every other row
                if ((rownum % 2) == 0) {
                    // make the row height bigger  (in twips - 1/20 of a point)
                    r.setHeight((short) 0x249);
                }

                //r.setRowNum(( short ) rownum);
                // create 50 cells (0-49) (the += 2 becomes apparent later
                for (int cellnum = 0; cellnum < 50; cellnum += 2) {
                    // create a numeric cell
                    c = r.createCell(cellnum);
                    // do some goofy math to demonstrate decimals
                    c.setCellValue(rownum * 10000 + cellnum
                            + (((double) rownum / 1000)
                            + ((double) cellnum / 10000)));

                    // on every other row
                    if ((rownum % 2) == 0) {
                        // set this cell to the first cell style we defined
                        c.setCellStyle(cs);
                    }

                    // create a string cell (see why += 2 in the
                    c = r.createCell(cellnum + 1);

                    // set the cell's string value to "TEST"
                    c.setCellValue("TEST");
                    // make this column a bit wider
                    s.setColumnWidth(cellnum + 1, (int) ((50 * 8) / ((double) 1 / 20)));

                    // on every other row
                    if ((rownum % 2) == 0) {
                        // set this to the white on red cell style
                        // we defined above
                        c.setCellStyle(cs2);
                    }

                }
            }

            //draw a thick black border on the row at the bottom using BLANKS
            // advance 2 rows
            rownum++;
            rownum++;

            r = s.createRow(rownum);

            // define the third style to be the default
            // except with a thick black border at the bottom
            cs3.setBorderBottom(BorderStyle.THICK);

            //create 50 cells
            for (int cellnum = 0; cellnum < 50; cellnum++) {
                //create a blank type cell (no value)
                c = r.createCell(cellnum);
                // set it to the thick black border style
                c.setCellStyle(cs3);
            }

            //end draw thick black border


            // demonstrate adding/naming and deleting a sheet
            // create a sheet, set its title then delete it
            wb.createSheet();
            wb.setSheetName(1, "DeletedSheet");
            wb.removeSheetAt(1);
            //end deleted sheet


            File file = new File(outPutPath);
            if(!file.exists()){
                file.mkdirs();
            }

            String filePath = outPutPath+ File.separator+"workbook.xls";
            // create a new file
            try (FileOutputStream out = new FileOutputStream(filePath)) {
                // write the workbook to the output stream
                // close our file (don't blow out our file handles
                wb.write(out);
            }
            if(new File(filePath).exists()){
                System.out.println("文件生成成功！");
            }
        }
    }
}